// ignore_for_file: implementation_imports

import 'dart:typed_data';
import 'package:flutter_opus/flutter_opus.dart';
import 'package:flutter_opus/src/constants/opus_constants.dart';

import '../app_logger.dart';

// Create the decoder
final decoder = OpusDecoder.create(
  sampleRate: 16000,
  channels: 1,
);

// Create the encoder - 匹配HTML版本：60ms帧
final encoder = OpusEncoder.create(
  sampleRate: 16000,
  channels: 1,
  application: opusApplicationAudio, // 适用于ASR的音频模式
);

class AudioFormatHelper {
  // 音频缓冲区，用于处理60ms帧对齐
  static final List<int> _audioBuffer = [];

  /// 清空音频缓冲区
  static void clearAudioBuffer() {
    _audioBuffer.clear();
    log.d('🧹 音频缓冲区已清空');
  }

            /// ASR专用：60ms帧Opus编码（匹配HTML版本，使用缓冲区对齐）
  static List<Uint8List> convertPcmToOpusFramesForASR(Uint8List pcmData) {
    final List<Uint8List> opusFrames = [];

    try {
      if (encoder == null) {
        log.d('❌ Opus encoder未初始化');
        return opusFrames;
      }

      // 🎯 匹配HTML版本：60ms帧 = 960个样本 @ 16kHz
      const int frameSize = 960; // 60ms @ 16kHz（匹配HTML版本）
      const int frameSizeBytes = frameSize * 2; // 1920字节每帧

      // 将新数据添加到缓冲区
      _audioBuffer.addAll(pcmData);
      // 处理缓冲区中的所有完整60ms帧
      while (_audioBuffer.length >= frameSizeBytes) {
        // 提取60ms帧数据
        final frameBytes = Uint8List.fromList(_audioBuffer.take(frameSizeBytes).toList());

        // 从缓冲区移除已处理的数据
        _audioBuffer.removeRange(0, frameSizeBytes);

        // 转换为Int16List（960个样本）
        final byteData = ByteData.sublistView(frameBytes);
        final int16List = Int16List(frameSize);

        for (int i = 0; i < frameSize; i++) {
          int16List[i] = byteData.getInt16(i * 2, Endian.little);
        }

        // 🎯 使用60ms帧编码（与HTML版本一致）
        final encodedFrame = encoder!.encode(int16List, frameSize);

        if (encodedFrame != null) {
          opusFrames.add(encodedFrame);
        }
      }
      return opusFrames;
    } catch (e) {
      log.d('❌ ASR Opus编码异常: $e');
      return opusFrames;
    }
  }

  /// 解码Opus数据到PCM格式
  static Int16List? convertOpusToPcm(Uint8List opusData) {
    try {
      // 检查decoder是否可用
      if (decoder == null) {
        log.d('Opus decoder未初始化');
        return null;
      }

      const int frameSize = 320; // 20ms at 16kHz
      final decodedBytes = decoder!.decode(opusData, frameSize);

      if (decodedBytes == null) {
        return null;
      }

      // 将Uint8List转换为Int16List
      final int16List = Int16List(decodedBytes.length ~/ 2);
      for (int i = 0; i < int16List.length; i++) {
        int16List[i] = (decodedBytes[i * 2 + 1] << 8) | decodedBytes[i * 2];
      }

      return int16List;
    } catch (e) {
      log.d('Opus解码失败: $e');
      return null;
    }
  }

  /// 释放资源
  static void dispose() {
    encoder?.dispose();
    decoder?.dispose();
  }
}